Tengo problemas con mis claves variables. getAllKeys guarda las claves en las claves variables. Quiero usar claves en prepareDate pero cuando el código llega a prepareDate no funciona porque los valores aún no están asignados a claves variables (debido a esto de JavaScript Async)
Necesito saber cómo puedo esperar hasta que las claves estén "listas" para que prepareDate (y el resto del código) puedan funcionar con las claves . Hay .then y promesa (si esta es la solución correcta), pero no sé cómo usarlos aquí.
let keys = []; const getAllKeys = async () => { try { keys = await AsyncStorage.getAllKeys(); } catch (e) { // read key error } console.log("keys: ", keys) // This works, the keys are saved inside keys } const getData = async (key) => { try { const jsonValue = await AsyncStorage.getItem(key); return jsonValue != null ? JSON.parse(jsonValue) : null; } catch (e) { // error reading value } }; const prepareData = () => { console.log("keys: ", keys) keys.forEach((key) => { // I want that this works but there is nothing inside keys.. console.log("hier") console.log(getData(key)) }) } getAllKeys(); prepareData();Dejar de usar keys de variables globales. En su lugar, return un valor de getAllKeys (para que getAllKeys() devuelva una promesa para eso) y acepte las claves como un parámetro para preprateData :
const getAllKeys = async () => { try { return await AsyncStorage.getAllKeys(); } catch (e) { // read key error return []; } }; const prepareData = async (keys) => { const data = Promise.all(keys.map(key => { console.log(key); return getData(key); })) console.log(data); return data; }Ahora puedes usarlos como
getAllKeys().then(prepareData);o en
(asnyc () => { const keys = await getAllKeys(); console.log("keys: ", keys) // This works await prepareData(keys); })();Puede posponer la llamada a prepareData hasta que finalice getAllKeys , así:
getAllKeys().then(prepareData);
Podemos hacer eso porque getAllKeys es una función asíncrona y, por lo tanto, devuelve una Promesa, lo que nos permite llamar al método then .